﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI.DaoTao
{
    using BLL;
    using DAL;
    using DAL.Models;
    using QldtSdh.Utils;
    using QldtSdh.GUI.Utils;

    /// <summary>
    /// Quản lý danh sách các Lớp học phần
    /// </summary>
    public partial class UcQuanLyLopHocPhan : QldtSdh.GUI.Common.BaseUserControl, QldtSdh.GUI.Common.IHocKyChangable
    {
        private bool _DoNotLoadLopHocPhanList = false;
        private bool _DoNotLoadChiTietLopHocPhan = false;
        private UcLopHocPhan_ThoiKhoaBieu _UcLopHocPhan_ThoiKhoaBieu = null;
        private UcLopHocPhan_DanhSachHocVien _UcLopHocPhan_DanhSachHocVien = null;
        private UcLopHocPhan_ThoiKhoaBieu GetUcLopHocPhan_ThoiKhoaBieu()
        {
            if (_UcLopHocPhan_ThoiKhoaBieu == null)
                _UcLopHocPhan_ThoiKhoaBieu = new UcLopHocPhan_ThoiKhoaBieu();
            return _UcLopHocPhan_ThoiKhoaBieu;
        }

        private UcLopHocPhan_DanhSachHocVien GetUcLopHocPhan_DanhSachHocVien()
        {
            if (_UcLopHocPhan_DanhSachHocVien == null)
                _UcLopHocPhan_DanhSachHocVien = new UcLopHocPhan_DanhSachHocVien();
            return _UcLopHocPhan_DanhSachHocVien;
        }

        /// <summary>
        /// Đơn vị đang được chọn trên giao diện
        /// </summary>
        private DonVi SelectedDonVi
        {
            get
            {
                DonVi donVi = null;
                if (bsDonViPhuTrach.Current != null)
                    donVi = bsDonViPhuTrach.Current as DonVi;
                return donVi;
            }
        }

        /// <summary>
        /// Lớp học phần đang được chọn trên giao diện
        /// </summary>
        private LopHocPhan SelectedLopHocPhan
        {
            get
            {
                LopHocPhan lopHocPhan = null;
                if (bsLopHocPhan.Current != null)
                    lopHocPhan = bsLopHocPhan.Current as LopHocPhan;
                return lopHocPhan;
            }
        }

        /// <summary>
        /// Học kỳ chứa danh sách các Lớp học phần
        /// </summary>
        public DAL.Models.HocKy HocKy { get; private set; }

        public UcQuanLyLopHocPhan()
        {
            InitializeComponent();

            gridLopHocPhan.SetDataGridViewAsListBox();
            gridLopHocPhan.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: false);
            gridLopHocPhan.AddRowIndexing();

            // Initialize
            btnLopHocPhan_DanhSachHocVien.PerformClick();
        }

        internal void SetHocKy(DAL.Models.HocKy hocKy)
        {
            // Thiết lập học kỳ chứa danh sách các Lớp học phần
            // -> 
            this.HocKy = hocKy;

            this._DoNotLoadLopHocPhanList = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // Nạp danh sách các đơn vị phụ trách chuyên môn
                    var lstDonVi = BizDaoTao.GetListDonViDaoTaoTrongHocKy(hocKy, db);

                    bsDonViPhuTrach.DataSource = lstDonVi;
                    cbxDonViPhuTrach.DisplayMember = "TenDonVi";
                    cbxDonViPhuTrach.DataSource = bsDonViPhuTrach;
                }
            }
            finally
            {
                this._DoNotLoadLopHocPhanList = false;
            }

            UpdateGuiBySelectedDonViPhuTrach();
        }

        private void btnLopHocPhan_View_Click(object sender, EventArgs e)
        {
            // Highlight tab được click
            var btnSet = new List<ToolStripButton> { btnLopHocPhan_DanhSachHocVien, btnLopHocPhan_ThoiKhoaBieu };
            foreach (var x in btnSet)
                x.BackColor = (x == sender) ? System.Drawing.Color.Gainsboro : System.Drawing.Color.White;

            // Lấy LHP đang được chọn
            DAL.Models.LopHocPhan selectedLHP = this.SelectedLopHocPhan;

            // Load UC cho tab được click
            IQuanLyLopHocPhan uc = null;
            if (sender == btnLopHocPhan_DanhSachHocVien)
                uc = GetUcLopHocPhan_DanhSachHocVien();
            else
                uc = GetUcLopHocPhan_ThoiKhoaBieu();

            Control currentUC = null;
            if (pnlLopHocPhan_View.Controls.Count > 0)
                currentUC = pnlLopHocPhan_View.Controls[0];
            if (uc == currentUC)
                return;

            uc.SetLopHocPhan(selectedLHP);

            // Hiển thị vào client của panel
            var view = (UserControl)uc;
            view.Dock = DockStyle.Fill;
            pnlLopHocPhan_View.Controls.Clear();
            pnlLopHocPhan_View.Controls.Add(view);
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            var lopHocPhan = this.SelectedLopHocPhan;
            if (lopHocPhan == null)
            {
                Utils.DialogUtils.ShowMessage("Bạn phải chọn một Lớp học phần để thực hiện chức năng này!");
                return;
            }
            var frm = new FormLopHocPhan_ChiTiet(lopHocPhan);
            frm.ShowDialog(this);
            UpdateGuiBySelectedLopHocPhan();
        }

        public void ChangeHocKy(DAL.Models.HocKy newHocKy)
        {
            if (newHocKy != this.HocKy)
                this.SetHocKy(newHocKy);
        }

        /// <summary>
        /// Nạp danh sách lớp học phần thuộc học kỳ "SelectedHocKy", thuộc đơn vị phụ trách "SelectedDonViPhuTrach".
        /// </summary>
        public void NapDanhSachLopHocPhan()
        {
            this._DoNotLoadChiTietLopHocPhan = true;
            try
            {
                var hocKy = this.HocKy;
                var donVi = this.SelectedDonVi;
                if (donVi == null)
                {
                    bsLopHocPhan.DataSource = null;
                    gridLopHocPhan.AutoGenerateColumns = false;
                    gridLopHocPhan.DataSource = bsLopHocPhan;
                }
                else
                {
                    bsLopHocPhan.DataSource = BizLopHocPhan.GetListOrderByTenLopHocPhan(hocKy.MaHocKyGUID, donVi.MaDonViGUID, hienThiHocPhanBatBuocTruoc: false);
                    //MessageBox.Show(string.Format("Có {0} lớp học phần thuộc đơn vị {1}", bsLopHocPhan.Count, donVi.TenDonVi));
                    gridLopHocPhan.AutoGenerateColumns = false;
                    gridLopHocPhan.DataSource = bsLopHocPhan;
                }
            }
            finally
            {
                this._DoNotLoadChiTietLopHocPhan = false;
            }
            HienThiThongTinThongKe();
            UpdateGuiBySelectedLopHocPhan();
        }

        private void HienThiThongTinThongKe()
        {
            if (bsLopHocPhan.Count == 0)
                lblThongKeSoLopHocPhan.Text = "Không có lớp học phần nào";
            else
                lblThongKeSoLopHocPhan.Text = string.Format("Có {0} lớp học phần", bsLopHocPhan.Count);
        }

        private void UpdateGuiBySelectedLopHocPhan()
        {
            var ucChiTietLopHocPhan = pnlLopHocPhan_View.Controls[0] as IQuanLyLopHocPhan;
            ucChiTietLopHocPhan.SetLopHocPhan(this.SelectedLopHocPhan);
            if (ucChiTietLopHocPhan is UcLopHocPhan_DanhSachHocVien)
                (ucChiTietLopHocPhan as UcLopHocPhan_DanhSachHocVien).SetUcQuanLyLopHocPhan(this);
        }

        private void bsDonViPhuTrach_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadLopHocPhanList)
                return;
            UpdateGuiBySelectedDonViPhuTrach();
        }

        private void bsLopHocPhan_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadChiTietLopHocPhan)
                return;
            UpdateGuiBySelectedLopHocPhan();
        }

        private void UpdateGuiBySelectedDonViPhuTrach()
        {
            btnInBangChamDiemQTHT.Enabled = btnInBangTheoDoiQTHT.Enabled = this.SelectedDonVi != null;
            NapDanhSachLopHocPhan();
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            var lopHocPhan = this.SelectedLopHocPhan;
            if (lopHocPhan == null)
            {
                DialogUtils.ShowMessage("Bạn phải chọn lớp học phần trước khi thực hiện thao tác này");
                return;
            }

            if (DialogUtils.Confirmed("Bạn có chắc chắn muốn xoá lớp học phần [{0}] không?", lopHocPhan.TenLopHocPhanFull) == false)
                return;

            try
            {
                BizLopHocPhan.XoaLopHocPhanRong(lopHocPhan.MaLopHocPhanGUID);
                UpdateGuiBySelectedDonViPhuTrach();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(string.Format("Không thể xoá lớp học phần [{0}] được.\nChi tiết lỗi: {1}", lopHocPhan.TenLopHocPhan, exc.Message));
            }
        }

        private void gridLopHocPhan_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (bsLopHocPhan.Count > 0 && e.RowIndex >= 0 && e.RowIndex < bsLopHocPhan.Count)
                btnSua_Click(null, null);
        }

        private void pnlLopHocPhan_View_ControlRemoved(object sender, ControlEventArgs e)
        {
            try
            {
                if (e.Control is UcLopHocPhan_ThoiKhoaBieu)
                {
                    if (FormResourcesViewer.IsShowing)
                        FormResourcesViewer.CloseIt();
                    FormLopHocPhan_ThoiKhoaBieu_KetQuaSaoChep.CloseIt();
                }
            }
            catch { }
        }

        private void btnInBangTheoDoiQTHT_Click(object sender, EventArgs e)
        {
            var frm = new FormInBangTheoDoiQTHT_Batch(bsLopHocPhan.DataSource as IList<LopHocPhan>, this.HocKy, this.SelectedDonVi);
            frm.ShowDialog();
        }

        private void btnInBangChamDiemQTHT_Click(object sender, EventArgs e)
        {
            var frm = new FormInBangChamDiemQTHT_Batch(bsLopHocPhan.DataSource as IList<LopHocPhan>, this.HocKy, this.SelectedDonVi);
            frm.ShowDialog();
        }
    }
}
